/*
* JBoss, Home of Professional Open Source
* Copyright 2013 Red Hat Inc. and/or its affiliates and other contributors
* as indicated by the @authors tag. All rights reserved.
*/
package org.searchisko.mbox.json;
import org.codehaus.jackson.JsonEncoding;
import org.codehaus.jackson.JsonFactory;
import org.codehaus.jackson.JsonGenerator;
import org.searchisko.mbox.dto.Mail;
import org.searchisko.mbox.dto.MailAttachment;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Map;
/**
* Convert {@link Mail} to JSON.
*
* @author Lukáš Vlček (lvlcek@redhat.com)
*/
public class Converter {
/**
* Convert mail to JSON. It is the same as calling #toJSON(mail, false).
* @param mail
* @return
*/
public static String toJSON(Mail mail) {
return toJSON(mail, false);
}
/**
* Convert mail to JSON. It is the same as calling #toJSON(mail, metadata, false).
* @param mail
* @param metadata
* @return
*/
public static String toJSON(Mail mail, Map<String, String> metadata) {
return toJSON(mail, metadata, false);
}
/**
* Convert mail to JSON. It is the same as calling #toJSON(mail, null, false).
* @param mail
* @param prettyPrint
* @return
*/
private static String toJSON(Mail mail, boolean prettyPrint) {
return toJSON(mail, null, prettyPrint);
}
/**
* Convert mail to JSON. JSON output encoding is hardcoded to UTF-*.
* Whatever is in metadata is added to or override result JSON.
* @param mail
* @param metadata
* @param prettyPrint
* @return
*/
public static String toJSON(Mail mail, Map<String,String> metadata, boolean prettyPrint) {
String json = null;
OutputStream os = new ByteArrayOutputStream();
JsonGenerator generator = null;
try {
generator = new JsonFactory().createJsonGenerator(os, JsonEncoding.UTF8);
generator.writeStartObject();
if (prettyPrint == true) {
generator.useDefaultPrettyPrinter();
}
if (mail.author_name() != null && !hasKey(metadata, "author_name")) generator.writeStringField("author_name", mail.author_name());
if (mail.author_email() != null && !hasKey(metadata, "author_email")) generator.writeStringField("author_email", mail.author_email());
if (mail.to() != null && !hasKey(metadata, "to")) {
generator.writeArrayFieldStart("to");
for (String to : mail.to()) {
generator.writeString(to);
}
generator.writeEndArray();
}
if (mail.subject_original() != null && !hasKey(metadata, "subject_original")) generator.writeStringField("subject_original", mail.subject_original());
if (mail.subject() != null && !hasKey(metadata, "subject")) generator.writeStringField("subject", mail.subject());
if (mail.dateUTC() != null && !hasKey(metadata, "date")) generator.writeStringField("date", mail.dateUTC());
if (mail.message_id_original() != null && !hasKey(metadata, "message_id_original")) generator.writeStringField("message_id_original", mail.message_id_original());
if (mail.message_id() != null && !hasKey(metadata, "message_id")) generator.writeStringField("message_id", mail.message_id());
if (mail.references() != null && !hasKey(metadata, "references")) {
generator.writeArrayFieldStart("references");
for (String ref : mail.references()) {
generator.writeString(ref);
}
generator.writeEndArray();
}
if (mail.in_reply_to() != null && !hasKey(metadata, "in_reply_to")) generator.writeStringField("in_reply_to", mail.in_reply_to());
if (mail.message_snippet() != null && !hasKey(metadata, "message_snippet")) generator.writeStringField("message_snippet", mail.message_snippet());
if (mail.first_text_message() != null && !hasKey(metadata, "first_text_message")) generator.writeStringField("first_text_message", mail.first_text_message());
if (mail.first_text_message_without_quotes() != null && !hasKey(metadata, "first_text_message_without_quotes")) generator.writeStringField("first_text_message_without_quotes", mail.first_text_message_without_quotes());
if (mail.first_html_message() != null && !hasKey(metadata, "first_html_message")) generator.writeStringField("first_html_message", mail.first_html_message());
if (mail.text_messages() != null && mail.text_messages().length > 0 && !hasKey(metadata, "text_messages")) {
generator.writeArrayFieldStart("text_messages");
for (String part : mail.text_messages())
{
generator.writeString(part);
}
generator.writeEndArray();
}
if (mail.text_messages_cnt() != null && !hasKey(metadata, "text_messages_cnt")) generator.writeNumberField("text_messages_cnt", mail.text_messages_cnt());
if (mail.html_messages() != null && mail.html_messages().length > 0 && !hasKey(metadata, "html_messages")) {
generator.writeArrayFieldStart("html_messages");
for (String part : mail.html_messages())
{
generator.writeString(part);
}
generator.writeEndArray();
}
if (mail.html_messages_cnt() != null && !hasKey(metadata, "html_messages_cnt")) generator.writeNumberField("html_messages_cnt", mail.html_messages_cnt());
if (mail.message_attachments() != null && mail.message_attachments().length > 0 && !hasKey(metadata, "message_attachments")) {
generator.writeArrayFieldStart("message_attachments");
for (MailAttachment atchm : mail.message_attachments()) {
generator.writeStartObject();
generator.writeStringField("content_type",atchm.getContentType());
generator.writeStringField("filename", atchm.getFileName());
generator.writeStringField("content", atchm.getContent());
generator.writeEndObject();
}
generator.writeEndArray();
}
if (mail.message_attachments_cnt() != null && !hasKey(metadata, "message_attachments_cnt")) generator.writeNumberField("message_attachments_cnt", mail.message_attachments_cnt());
if (metadata != null && !metadata.isEmpty()) {
for (String key : metadata.keySet()) {
if (key.trim().length() > 0) {
generator.writeStringField(key, metadata.get(key));
}
}
}
generator.writeEndObject();
generator.close();
json = os.toString();
} catch (IOException e) {
// TODO
} finally {
try {
if (os != null) os.close();
} catch (IOException e) {
// ignore
}
}
return json;
}
private static boolean hasKey(Map<String, String> metadata, String key) {
if (metadata != null) {
return metadata.containsKey(key);
} else {
return false;
}
}
}